# 赋值(内存指向的改变) 赋值是将id重新赋值给了一个新的变量，引用计数加1。
# 修改不可变对象（str、tuple、int）需要开辟新的内存空间。
s = 'asdfadsfadsgasd'
print('s------>id',id(s))
b = s
print('b------>id',id(b))
print(b is s)
b += 'ac'
print('b------>id',id(b))
print(s is b)
print(s,b)



# 修改可变对象时（list、dict、set）不需要开辟新的内存空间。
ls = [1,2,3]
print('ls----->',id(ls))
ls1 = ls
print('ls1----->',id(ls1))
print(ls1 is ls)
ls1.append(8)
print('ls1------>',id(ls1),ls1)

# 变量交换
c = 123
d = 456
temp = c
c = d
d = temp
print(c,d)

# 浅拷贝
# 浅拷只是拷贝父对象，而对于父对象中的子对象并不会进行拷贝。
e = {'a':[1,2,3]}
print('------>e',id(e),id(e['a']))
f = e.copy()
print('------>f',id(f),id(e['a']))
print('f----->',f)
f['a'][2] = 999
print('f----->',f)
print('e---->',e)

# 深拷贝 
# 深拷贝完全赋值被复制对象的元素，不是复制内存地址，是开辟新的内存空间将被复制对象的值放在了新的内存空间中，并将新的内存地址指向了新的变量，这样的话，修改原对象不会对新的对象产生影响。
import copy
dt = {'a':[1,2,3],'b':4}
print('dt----->',id(dt),id(dt['a']))
dt1 = copy.deepcopy(dt)
print('dt1------>',id(dt1),id(dt1['a']))
dt1['a'][1] = 111
print('dt1------>',dt1)
print('dt------>',dt)